/* 

给定一个排序数组和一个目标值，在数组中找到目标值，并返回其索引。如果目标值不存在于数组中，返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。



示例：
输入: nums = [1,3,5,6], target = 5
输出: 2

输入: nums = [1,3,5,6], target = 7
输出: 4
*/

/* 
注意：数组有序
思路：二分查找+指针

*/

/* 

时间复杂度：O(logn)，其中 n 为数组的长度。二分查找所需的时间复杂度为 O(logn)。

空间复杂度：O(1)。我们只需要常数空间存放若干变量。
*/

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
 var searchInsert = function(nums, target) {
    const n=nums.length
    // 声明两个指针及中间指针
    let left=0,right=n-1,mid=0
    // 声明目标指针(默认添加到末尾)
    let ans=n
    while(left<=right){
        // 取left与right的中间位置
        mid=left+((right-left)>>1)
        // 目标值在左侧区间时，记录ans指针为mid所在位置
        if(target<=nums[mid]){
            ans=mid
            right=mid-1
        }else{
            left=mid+1
        }
    }
    return ans

};


// 运行
let nums = [0,1,2,2,3,0,4,2], val = 2
console.log(searchInsert(nums,val));
